package com.hzy.utils.queue.DelayQueue;


import java.util.*;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * DelayQueue的测试类
 *
 * @date 2020-07-14 20:23:37
 */
public class DelayQueueTest {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue delayQueue=new DelayQueue();

        // add/put 添加 内部实现是 offer
        delayQueue.add(new MyDelayQueue("", 1000L));
        delayQueue.offer(new MyDelayQueue("", 2000L));
        delayQueue.offer(new MyDelayQueue("", 2000L), 2000L, TimeUnit.SECONDS);
        delayQueue.put(new MyDelayQueue("", 1000L));

        // 从原子上删除此延迟队列中的所有元素
        delayQueue.clear();
        // 从此队列中删除所有可用的元素，并将它们添加到给定的集合中
        // i 传输的元素数
        List<DelayQueue> list = new ArrayList<>();
        int i = delayQueue.drainTo(list);
        System.out.println(i);

        // 从此队列中最多移除给定数量的可用元素，并将它们添加到给定的集合中。
        list = new ArrayList<>();
        i = delayQueue.drainTo(list, 10);
        System.out.println(i);

        // 检索但不删除此队列的头，如果此队列为空，则返回null
        Delayed peek = delayQueue.peek();

        // 检索并删除此队列的头， 如果此队列没有延迟过期的元素，则返回null
        Delayed poll = delayQueue.poll();
        // 检查并删除延迟的数据，如有必要，等候到超时为止
        // 超过时间，还是未有延迟数据，则返回null
        poll = delayQueue.poll(1000, TimeUnit.SECONDS);

        // 从指定队列中删除指定元素的单个实例（如果存在），无论它是否已过期。
        boolean remove = delayQueue.remove(peek);
        System.out.println(remove);

        // 返回此集合中的元素数。
        int size = delayQueue.size();
        System.out.println(size);

        // 检查并删除队列的头，或者一直等待有删除元素直到超时
        Delayed take = delayQueue.take();

        // 返回一个包含此队列中所有元素的数组
        Object[] objects = delayQueue.toArray();
        Delayed[] delayeds = (Delayed[]) delayQueue.toArray(new Delayed[20]);


    }
}
